/**
* \file		Comportement.h
* \brief	Définit la structure Comportement
* \details	C'est ici que sont définis la structure Comportement, ses
*		accesseurs et ses mutateurs.
*/

#ifndef COMPORTEMENT_H
#define COMPORTEMENT_H

#include "Action.h"

/**
* \brief	Informations définissant un Comportement
* \details	Cette structure comporte le nom du comportement, un pointeur
*		sur la première des actions qui le composent et un booléen
*		indiquant si la technologie nécessaire à son accomplissement a
*		été développée.
*/
typedef struct
{
   char *nom;			/*!< Nom du Comportement : chaîne de 
				caractères */
   Action *premAct;		/*!< Pointeur vers la première action du
				comportement */
   Action *dernAct;		/*!< Pointeur vers la dernière action du
				comportement */
   char techDev;		/*!< Caractère faisant office de booléen : 
				vaut 1 si la technologie nécessaire au
				comportement a été développée, vaut 0 sinon */
} Comportement;

/*======================== Gestion de la mémoire =======================*/
/**
* \brief	Initialise une structure Comportement
* \details	Met à NULL tous les pointeurs. Pour l'heure le champ dev est
*		mis à 1 car la fonction l'éditant lors du développement d'une
*		technologie n'a pas encore été implémentée.
* \param	pcomp		Pointeur vers le Comportement à initialiser
*/
void initComp(Comportement *pcomp);

/**
* \brief	Crée un Comportement
* \details	Crée un Comportement et l'initialise grâce à initComp.
* \param	pcomp		Pointeur sur l'adresse du Comportement à créer
*/
void creerComp(Comportement **pcomp);

/**
* \brief	Libère la mémoire allouée aux champs du comportement donné
* \details	Met à NULL tous les Pointeurs, désalloue la mémoire réservée
*		initialement pour les tableaux de char
* \param	pcomp		Pointeur vers le Comportement à libérer
*/
void libereComp(Comportement *pcomp);

/**
* \brief	Libère la mémoire allouée à un Comportement donné
* \param	pcomp		Pointeur vers le Comportement à détruire
*/
void detruireComp(Comportement *pcomp);


/*============================= Accesseurs =============================*/
/**
* \brief	Retourne le nom d'un Comportement donné
* \return	Une chaîne de caractères
* \param	pcomp		Pointeur vers un Comportement
*/
char *getNomComp(const Comportement *pcomp);

/**
* \brief	Retourne le pointeur sur la première action d'un Comportement
*		donné
* \return	Un pointeur sur Action
* \param	pcomp		Pointeur vers un Comportement
*/
Action *getPremActionComp(const Comportement *pcomp);

/**
* \brief	Retourne le pointeur sur la dernière action d'un Comportement
*		donné
* \return	Un pointeur sur Action
* \param	pcomp		Pointeur vers un Comportement
*/
Action *getDernActionComp(const Comportement *pcomp);

/**
* \brief	Retourne le caractère indiquant si la technologie permettant
*		l'accomplissement du comportement donné a été développée (si
*		oui : 1, si non : 0)
* \return	Un caractère
* \param	pcomp		Pointeur vers un Comportement
*/
char getDevComp(const Comportement *pcomp);


/*============================== Mutateurs =============================*/
/**
* \brief	Remplace le nom d'un Comportement donné par un nouveau nom
* \param	pcomp		Pointeur vers un comportement
* \param	nouvNom		Nom, chaîne de caractères
*/
void setNomComp(Comportement *pcomp, char *nouvNom);

/**
* \brief	Remplace le pointeur vers la première action d'un comportement
*		donné par un pointeur passé en paramètre
* \param	pcomp		Pointeur vers un comportement
* \param	nouvAct		Nouvelle action, pointeur vers Action
*/
void setPremActionComp(Comportement *pcomp, Action *nouvAct);

/**
* \brief	Remplace le pointeur vers la dernière action d'un comportement
*		donné par un pointeur passé en paramètre
* \param	pcomp		Pointeur vers un comportement
* \param	nouvAct		Nouvelle action, pointeur vers Action
*/
void setDernActionComp(Comportement *pcomp, Action *nouvAct);

/**
* \brief	Remplace le caractère indiquant si la technologie nécessaire à
*		l'accomplissement du comportement donné par le caractère passé
*		en paramètre
* \param	pcomp		Pointeur vers un comportement
* \param	nouvVal		Caractère, nouvelle valeur de techDev
*/
void setDevComp(Comportement *pcomp, char nouvVal);

/*=================== Montage de la chaine d'actions ===================*/
/**
* \brief	Ajoute une Action donnée à la chaîne d'actions formant le
*		Comportement. L'ajoute en tête de chaîne.
* \param	pcomp		Pointeur vers un comportement
* \param	nouvAct		Pointeur vers l'action à ajouter au
*				comportement
*/
void ajouteActionComp(Comportement *pcomp, Action *nouvAct);

/**
* \brief	Enlève la première action de la chaîne comportementale
* \param	pcomp		Pointeur vers un comportement
*/
void enlevePremActionComp(Comportement *pcomp);

/**
* \brief	Démonte la chaîne d'actions du comportement
* \param	pcomp		Pointeur vers un comportement
*/
void demonteChaineActionComp(Comportement *pcomp);

/*========================== Fonctions autres ==========================*/
/**
* \brief	Fonction renvoyant 1 si le nom d'un comportement donné et la
*		chaîne de caractères données sont égaux. Sinon, renvoie 0
* \return	Un caractère
* \param	pcomp		Pointeur vers un Comportement
* \param	nom		Nom à comparer, chaîne de caractères
*/
char compareNomComp(const Comportement *pcomp, char *nom);

/**
* \brief	Crée un Comportement à partir des données fournies et renvoie
*		un pointeur pointant dessus
* \return	Un pointeur vers la nouvelle Action
* \param	nom		Nom du Comportement, chaîne de caractères
*/
Comportement *creerCompletComp(char *nom);

/*========================== Fonction de Test ==========================*/
/**
* \brief	Teste les différentes fonctions du module Comportement
* \details	Teste les différentes fonctions du module Comportement en les
*		utilisant avec diverses valeurs plus ou moins probables
*/
void testComp();

#endif
